import { TextDocument, Position } from "vscode"
import { dirname, resolve } from "path"
import { returnLocation } from "../utils/returnLocation"
import { readVueConfigJs } from "../utils/readVueConfigJs"
import { existFilePath } from "../utils/existFilePath"
import { toNodeModule } from "../core/toNodeModule"
/**
 * vscode的路径跳转机制为：
 * 提供一个provider程序即处理函数，这个函数返回文件位置或undefined
 * 返回文件位置则ctrl+左键时有链接跳转效果，如果返回undefined，则无任何效果
 * @param document 当前打开的vscode编辑器
 * @param position 光标位置
 * @returns 文件位置或undefined
 */
export function provideDefinition(document: TextDocument, position: Position) {
  const fileName = document.fileName // 当前文件完整路径
  const workDir = dirname(fileName) // 当前文件所在目录
  const word = document.getText(document.getWordRangeAtPosition(position)) // 当前光标所在单词
  const line = document.lineAt(position) // 当前光标所在行
  // line.text表示当前行文本
  const startIndex = line.text.indexOf('"') + 1 // 记录第一个"位置
  let text = line.text.substring(startIndex, line.text.indexOf('"', startIndex + 1)) // 获取第一个"和第二个"之间的字符
  const projectPath = workDir.substring(0, workDir.lastIndexOf("src")) // 以src为界限获取项目目录路径

  // 功能1,package.json中跳转到对应包
  const isToNodeModule = toNodeModule(fileName, workDir, word)
  if (isToNodeModule) return isToNodeModule

  // 功能2,支持webpack中用于图片和css的路径别名~@
  if (text.includes("~@")) {
    const isExistFilePath = existFilePath(text, projectPath, [{ key: "~@", value: "src\\" }])
    if (isExistFilePath) return isExistFilePath
  }

  // 功能3,vue.config.js中的路径别名
  if (text.includes("@")) {
    const location = existFilePath(text, projectPath, readVueConfigJs(projectPath))
    if (location) return location
  }

  // 功能4,支持简写写法，如省略index.js,index.vue等
  const location = returnLocation(resolve(workDir, text))
  if (location) return location
}
